#ifndef _KC_ENTITY_H__KC_
#define _KC_ENTITY_H__KC_

#include <string>
#include <vector>
#include <list>
#include <unicode/unistr.h>
#include "Header.h"
#include "ContentType.h"
#include "Address.h"

namespace kc_sf
{
	/**
	 * Klasa, reprezentująca strukturę entity z rfc2822.
	 * Przechowuje nagłówki i informacje określające encję.
	 *
	 * Encją może być:
	 * - wiadomość rozumiana jako message z rfc2882,
	 * - pojedyncza entity-part, czyli singlepart ( tamże )
	 * - kilkuczęściowa entity-part, czyli multipart ( tamże ).
	 *
	 * Każda encja ma swoją encję - rodzica.
	 */
	class Entity
	{
		public:

			ContentType eContentType;
			EncodingType eEncoding;
			std::string eCharset;
			std::string eData;
			std::string eBoundary;
			unsigned long eSize;
			Address eFrom;
			AddressCollection eTo;
			AddressCollection eCc;
			AddressCollection eBcc;
			UnicodeString eSubject;

			Entity();
			Entity( const Entity &entity );
			Entity & operator= ( const Entity &entity );
			~Entity();

			void addHeader( Header *header );
			void addChild( Entity *child );

			std::vector <Entity *> & getChildren() { return e_children; }
			std::vector <Header *> getHeaders();

			void setParent( Entity* parent );
			Entity* getParent() { return e_parent; }

			void setSubject( const std::string &subject );
			UnicodeString getSubject() const;

			bool isSinglepart() const;
			bool isMultipart() const;

		private:

			Entity *e_parent;
			std::list <Header *> e_headers;
			std::vector <Entity *> e_children;
	};
}

#endif // _KC_ENTITY_H__KC_
